{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Matplotlib Animation\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Method 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from matplotlib import animation, rc\n",
    "from IPython.display import HTML\n",
    "\n",
    "\n",
    "# First set up the figure, the axis, and the plot element we want to animate\n",
    "fig, ax = plt.subplots()\n",
    "\n",
    "ax.set_xlim(( 0, 2))\n",
    "ax.set_ylim((-2, 2))\n",
    "\n",
    "line, = ax.plot([], [], lw=2)\n",
    "\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<video width=\"432\" height=\"288\" controls autoplay loop>\n",
       "  <source type=\"video/mp4\" src=\"data:video/mp4;base64,AAAAHGZ0eXBNNFYgAAACAGlzb21pc28yYXZjMQAAAAhmcmVlAABeL21kYXQAAAKuBgX//6rcRem9\n",
       "5tlIt5Ys2CDZI+7veDI2NCAtIGNvcmUgMTQ4IHIyNjQzIDVjNjU3MDQgLSBILjI2NC9NUEVHLTQg\n",
       "QVZDIGNvZGVjIC0gQ29weWxlZnQgMjAwMy0yMDE1IC0gaHR0cDovL3d3dy52aWRlb2xhbi5vcmcv\n",
       "eDI2NC5odG1sIC0gb3B0aW9uczogY2FiYWM9MSByZWY9MyBkZWJsb2NrPTE6MDowIGFuYWx5c2U9\n",
       "MHgzOjB4MTEzIG1lPWhleCBzdWJtZT03IHBzeT0xIHBzeV9yZD0xLjAwOjAuMDAgbWl4ZWRfcmVm\n",
       "PTEgbWVfcmFuZ2U9MTYgY2hyb21hX21lPTEgdHJlbGxpcz0xIDh4OGRjdD0xIGNxbT0wIGRlYWR6\n",
       "b25lPTIxLDExIGZhc3RfcHNraXA9MSBjaHJvbWFfcXBfb2Zmc2V0PS0yIHRocmVhZHM9OSBsb29r\n",
       "YWhlYWRfdGhyZWFkcz0xIHNsaWNlZF90aHJlYWRzPTAgbnI9MCBkZWNpbWF0ZT0xIGludGVybGFj\n",
       "ZWQ9MCBibHVyYXlfY29tcGF0PTAgY29uc3RyYWluZWRfaW50cmE9MCBiZnJhbWVzPTMgYl9weXJh\n",
       "bWlkPTIgYl9hZGFwdD0xIGJfYmlhcz0wIGRpcmVjdD0xIHdlaWdodGI9MSBvcGVuX2dvcD0wIHdl\n",
       "aWdodHA9MiBrZXlpbnQ9MjUwIGtleWludF9taW49MjUgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVz\n",
       "aD0wIHJjX2xvb2thaGVhZD00MCByYz1jcmYgbWJ0cmVlPTEgY3JmPTIzLjAgcWNvbXA9MC42MCBx\n",
       "cG1pbj0wIHFwbWF4PTY5IHFwc3RlcD00IGlwX3JhdGlvPTEuNDAgYXE9MToxLjAwAIAAABKiZYiE\n",
       "AC///vau/MsrRwuVLh1Ze7NR8uhJcv2IMH1oAAADAADVayF8oYJVUBjgvNA9NyX0pOD8+0aEKaS/\n",
       "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\n",
       "GHN0dHMAAAAAAAAAAQAAAGQAAAEAAAAAFHN0c3MAAAAAAAAAAQAAAAEAAAMwY3R0cwAAAAAAAABk\n",
       "AAAAAQAAAgAAAAABAAADAAAAAAEAAAEAAAAAAQAAAwAAAAABAAABAAAAAAEAAAMAAAAAAQAAAQAA\n",
       "AAABAAADAAAAAAEAAAEAAAAAAQAAAwAAAAABAAABAAAAAAEAAAMAAAAAAQAAAQAAAAABAAAEAAAA\n",
       "AAEAAAIAAAAAAQAAAAAAAAABAAAEAAAAAAEAAAIAAAAAAQAAAAAAAAABAAADAAAAAAEAAAEAAAAA\n",
       "AQAABAAAAAABAAACAAAAAAEAAAAAAAAAAQAAAwAAAAABAAABAAAAAAEAAAMAAAAAAQAAAQAAAAAB\n",
       "AAADAAAAAAEAAAEAAAAAAQAAAwAAAAABAAABAAAAAAEAAAMAAAAAAQAAAQAAAAABAAADAAAAAAEA\n",
       "AAEAAAAAAQAAAwAAAAABAAABAAAAAAEAAAMAAAAAAQAAAQAAAAABAAADAAAAAAEAAAEAAAAAAQAA\n",
       "AwAAAAABAAABAAAAAAEAAAMAAAAAAQAAAQAAAAABAAADAAAAAAEAAAEAAAAAAQAAAwAAAAABAAAB\n",
       "AAAAAAEAAAMAAAAAAQAAAQAAAAABAAADAAAAAAEAAAEAAAAAAQAAAwAAAAABAAABAAAAAAEAAAMA\n",
       "AAAAAQAAAQAAAAABAAADAAAAAAEAAAEAAAAAAQAAAwAAAAABAAABAAAAAAEAAAMAAAAAAQAAAQAA\n",
       "AAABAAADAAAAAAEAAAEAAAAAAQAAAwAAAAABAAABAAAAAAEAAAMAAAAAAQAAAQAAAAABAAADAAAA\n",
       "AAEAAAEAAAAAAQAAAwAAAAABAAABAAAAAAEAAAMAAAAAAQAAAQAAAAABAAADAAAAAAEAAAEAAAAA\n",
       "AQAAAwAAAAABAAABAAAAAAEAAAMAAAAAAQAAAQAAAAABAAADAAAAAAEAAAEAAAAAAQAAAwAAAAAB\n",
       "AAABAAAAAAEAAAMAAAAAAQAAAQAAAAABAAADAAAAAAEAAAEAAAAAAQAAAwAAAAABAAABAAAAAAEA\n",
       "AAMAAAAAAQAAAQAAAAABAAADAAAAAAEAAAEAAAAAAQAAAwAAAAABAAABAAAAAAEAAAMAAAAAAQAA\n",
       "AQAAAAAcc3RzYwAAAAAAAAABAAAAAQAAAGQAAAABAAABpHN0c3oAAAAAAAAAAAAAAGQAABVYAAAB\n",
       "vwAAAJgAAAFeAAAAbwAAAPQAAACMAAABKQAAAH4AAAEYAAAAhgAAAP0AAACCAAAA8AAAAIwAAABx\n",
       "AAABGAAAAH8AAAB/AAABNwAAAIMAAADlAAAAigAAAIoAAAFOAAAAhgAAAUEAAABxAAABQgAAAHMA\n",
       "AAEiAAAAeAAAARIAAAB6AAABNgAAAHsAAAEDAAAAeQAAARoAAAB4AAAA7QAAAHMAAAD0AAAAgAAA\n",
       "APMAAAB3AAAA+AAAAHMAAADXAAAAcgAAAPcAAAB+AAABBQAAAIMAAADGAAAAdwAAANQAAABvAAAA\n",
       "8wAAAIcAAAERAAAAgQAAAQMAAAB0AAAA5wAAAHIAAAEHAAAAcgAAAPgAAAB/AAABGwAAAHgAAAFI\n",
       "AAAAeQAAAQYAAABuAAAA8gAAAG0AAADuAAAAcgAAAOoAAABdAAABAAAAAHcAAAEHAAAAeAAAAN0A\n",
       "AAB5AAAA+AAAAHoAAAC3AAAAcQAAANIAAABuAAAAtwAAAHgAAACsAAAAcwAAAJwAAAB4AAAAFHN0\n",
       "Y28AAAAAAAAAAQAAACwAAABidWR0YQAAAFptZXRhAAAAAAAAACFoZGxyAAAAAAAAAABtZGlyYXBw\n",
       "bAAAAAAAAAAAAAAAAC1pbHN0AAAAJal0b28AAAAdZGF0YQAAAAEAAAAATGF2ZjU2LjQwLjEwMQ==\n",
       "\">\n",
       "  Your browser does not support the video tag.\n",
       "</video>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "# initialization function: plot the background of each frame\n",
    "def init():\n",
    "    line.set_data([], [])\n",
    "    return (line,)\n",
    "\n",
    "# animation function. This is called sequentially\n",
    "def animate(i):\n",
    "    x = np.linspace(0, 2, 1000)\n",
    "    y = np.sin(2 * np.pi * (x - 0.01 * i))\n",
    "    line.set_data(x, y)\n",
    "    return (line,)\n",
    "\n",
    "# call the animator. blit=True means only re-draw the parts that have changed.\n",
    "anim = animation.FuncAnimation(fig, animate, init_func=init,\n",
    "                               frames=100, interval=20, blit=True)\n",
    "\n",
    "HTML(anim.to_html5_video())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Method 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "window.mpl = {};\n",
       "\n",
       "\n",
       "mpl.get_websocket_type = function() {\n",
       "    if (typeof(WebSocket) !== 'undefined') {\n",
       "        return WebSocket;\n",
       "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
       "        return MozWebSocket;\n",
       "    } else {\n",
       "        alert('Your browser does not have WebSocket support.' +\n",
       "              'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
       "              'Firefox 4 and 5 are also supported but you ' +\n",
       "              'have to enable WebSockets in about:config.');\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
       "    this.id = figure_id;\n",
       "\n",
       "    this.ws = websocket;\n",
       "\n",
       "    this.supports_binary = (this.ws.binaryType != undefined);\n",
       "\n",
       "    if (!this.supports_binary) {\n",
       "        var warnings = document.getElementById(\"mpl-warnings\");\n",
       "        if (warnings) {\n",
       "            warnings.style.display = 'block';\n",
       "            warnings.textContent = (\n",
       "                \"This browser does not support binary websocket messages. \" +\n",
       "                    \"Performance may be slow.\");\n",
       "        }\n",
       "    }\n",
       "\n",
       "    this.imageObj = new Image();\n",
       "\n",
       "    this.context = undefined;\n",
       "    this.message = undefined;\n",
       "    this.canvas = undefined;\n",
       "    this.rubberband_canvas = undefined;\n",
       "    this.rubberband_context = undefined;\n",
       "    this.format_dropdown = undefined;\n",
       "\n",
       "    this.image_mode = 'full';\n",
       "\n",
       "    this.root = $('<div/>');\n",
       "    this._root_extra_style(this.root)\n",
       "    this.root.attr('style', 'display: inline-block');\n",
       "\n",
       "    $(parent_element).append(this.root);\n",
       "\n",
       "    this._init_header(this);\n",
       "    this._init_canvas(this);\n",
       "    this._init_toolbar(this);\n",
       "\n",
       "    var fig = this;\n",
       "\n",
       "    this.waiting = false;\n",
       "\n",
       "    this.ws.onopen =  function () {\n",
       "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
       "            fig.send_message(\"send_image_mode\", {});\n",
       "            if (mpl.ratio != 1) {\n",
       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
       "            }\n",
       "            fig.send_message(\"refresh\", {});\n",
       "        }\n",
       "\n",
       "    this.imageObj.onload = function() {\n",
       "            if (fig.image_mode == 'full') {\n",
       "                // Full images could contain transparency (where diff images\n",
       "                // almost always do), so we need to clear the canvas so that\n",
       "                // there is no ghosting.\n",
       "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
       "            }\n",
       "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
       "        };\n",
       "\n",
       "    this.imageObj.onunload = function() {\n",
       "        fig.ws.close();\n",
       "    }\n",
       "\n",
       "    this.ws.onmessage = this._make_on_message_function(this);\n",
       "\n",
       "    this.ondownload = ondownload;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_header = function() {\n",
       "    var titlebar = $(\n",
       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
       "        'ui-helper-clearfix\"/>');\n",
       "    var titletext = $(\n",
       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
       "        'text-align: center; padding: 3px;\"/>');\n",
       "    titlebar.append(titletext)\n",
       "    this.root.append(titlebar);\n",
       "    this.header = titletext[0];\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = $('<div/>');\n",
       "\n",
       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
       "\n",
       "    function canvas_keyboard_event(event) {\n",
       "        return fig.key_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
       "    this.canvas_div = canvas_div\n",
       "    this._canvas_extra_style(canvas_div)\n",
       "    this.root.append(canvas_div);\n",
       "\n",
       "    var canvas = $('<canvas/>');\n",
       "    canvas.addClass('mpl-canvas');\n",
       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
       "\n",
       "    this.canvas = canvas[0];\n",
       "    this.context = canvas[0].getContext(\"2d\");\n",
       "\n",
       "    var backingStore = this.context.backingStorePixelRatio ||\n",
       "\tthis.context.webkitBackingStorePixelRatio ||\n",
       "\tthis.context.mozBackingStorePixelRatio ||\n",
       "\tthis.context.msBackingStorePixelRatio ||\n",
       "\tthis.context.oBackingStorePixelRatio ||\n",
       "\tthis.context.backingStorePixelRatio || 1;\n",
       "\n",
       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband = $('<canvas/>');\n",
       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
       "\n",
       "    var pass_mouse_events = true;\n",
       "\n",
       "    canvas_div.resizable({\n",
       "        start: function(event, ui) {\n",
       "            pass_mouse_events = false;\n",
       "        },\n",
       "        resize: function(event, ui) {\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "        stop: function(event, ui) {\n",
       "            pass_mouse_events = true;\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "    });\n",
       "\n",
       "    function mouse_event_fn(event) {\n",
       "        if (pass_mouse_events)\n",
       "            return fig.mouse_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
       "\n",
       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
       "\n",
       "    canvas_div.on(\"wheel\", function (event) {\n",
       "        event = event.originalEvent;\n",
       "        event['data'] = 'scroll'\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        mouse_event_fn(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.append(canvas);\n",
       "    canvas_div.append(rubberband);\n",
       "\n",
       "    this.rubberband = rubberband;\n",
       "    this.rubberband_canvas = rubberband[0];\n",
       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
       "\n",
       "    this._resize_canvas = function(width, height) {\n",
       "        // Keep the size of the canvas, canvas container, and rubber band\n",
       "        // canvas in synch.\n",
       "        canvas_div.css('width', width)\n",
       "        canvas_div.css('height', height)\n",
       "\n",
       "        canvas.attr('width', width * mpl.ratio);\n",
       "        canvas.attr('height', height * mpl.ratio);\n",
       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
       "\n",
       "        rubberband.attr('width', width);\n",
       "        rubberband.attr('height', height);\n",
       "    }\n",
       "\n",
       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
       "    // upon first draw.\n",
       "    this._resize_canvas(600, 600);\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
       "        return false;\n",
       "    });\n",
       "\n",
       "    function set_focus () {\n",
       "        canvas.focus();\n",
       "        canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    window.setTimeout(set_focus, 100);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items) {\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) {\n",
       "            // put a spacer in here.\n",
       "            continue;\n",
       "        }\n",
       "        var button = $('<button/>');\n",
       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
       "                        'ui-button-icon-only');\n",
       "        button.attr('role', 'button');\n",
       "        button.attr('aria-disabled', 'false');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "\n",
       "        var icon_img = $('<span/>');\n",
       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
       "        icon_img.addClass(image);\n",
       "        icon_img.addClass('ui-corner-all');\n",
       "\n",
       "        var tooltip_span = $('<span/>');\n",
       "        tooltip_span.addClass('ui-button-text');\n",
       "        tooltip_span.html(tooltip);\n",
       "\n",
       "        button.append(icon_img);\n",
       "        button.append(tooltip_span);\n",
       "\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    var fmt_picker_span = $('<span/>');\n",
       "\n",
       "    var fmt_picker = $('<select/>');\n",
       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
       "    fmt_picker_span.append(fmt_picker);\n",
       "    nav_element.append(fmt_picker_span);\n",
       "    this.format_dropdown = fmt_picker[0];\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = $(\n",
       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
       "        fmt_picker.append(option)\n",
       "    }\n",
       "\n",
       "    // Add hover states to the ui-buttons\n",
       "    $( \".ui-button\" ).hover(\n",
       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
       "    );\n",
       "\n",
       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
       "    // which will in turn request a refresh of the image.\n",
       "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_message = function(type, properties) {\n",
       "    properties['type'] = type;\n",
       "    properties['figure_id'] = this.id;\n",
       "    this.ws.send(JSON.stringify(properties));\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_draw_message = function() {\n",
       "    if (!this.waiting) {\n",
       "        this.waiting = true;\n",
       "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
       "    }\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    var format_dropdown = fig.format_dropdown;\n",
       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
       "    fig.ondownload(fig, format);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
       "    var size = msg['size'];\n",
       "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
       "        fig._resize_canvas(size[0], size[1]);\n",
       "        fig.send_message(\"refresh\", {});\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
       "    var x0 = msg['x0'] / mpl.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
       "    var x1 = msg['x1'] / mpl.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
       "    x0 = Math.floor(x0) + 0.5;\n",
       "    y0 = Math.floor(y0) + 0.5;\n",
       "    x1 = Math.floor(x1) + 0.5;\n",
       "    y1 = Math.floor(y1) + 0.5;\n",
       "    var min_x = Math.min(x0, x1);\n",
       "    var min_y = Math.min(y0, y1);\n",
       "    var width = Math.abs(x1 - x0);\n",
       "    var height = Math.abs(y1 - y0);\n",
       "\n",
       "    fig.rubberband_context.clearRect(\n",
       "        0, 0, fig.canvas.width, fig.canvas.height);\n",
       "\n",
       "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
       "    // Updates the figure title.\n",
       "    fig.header.textContent = msg['label'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
       "    var cursor = msg['cursor'];\n",
       "    switch(cursor)\n",
       "    {\n",
       "    case 0:\n",
       "        cursor = 'pointer';\n",
       "        break;\n",
       "    case 1:\n",
       "        cursor = 'default';\n",
       "        break;\n",
       "    case 2:\n",
       "        cursor = 'crosshair';\n",
       "        break;\n",
       "    case 3:\n",
       "        cursor = 'move';\n",
       "        break;\n",
       "    }\n",
       "    fig.rubberband_canvas.style.cursor = cursor;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
       "    fig.message.textContent = msg['message'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
       "    // Request the server to send over a new figure.\n",
       "    fig.send_draw_message();\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
       "    fig.image_mode = msg['mode'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Called whenever the canvas gets updated.\n",
       "    this.send_message(\"ack\", {});\n",
       "}\n",
       "\n",
       "// A function to construct a web socket function for onmessage handling.\n",
       "// Called in the figure constructor.\n",
       "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
       "    return function socket_on_message(evt) {\n",
       "        if (evt.data instanceof Blob) {\n",
       "            /* FIXME: We get \"Resource interpreted as Image but\n",
       "             * transferred with MIME type text/plain:\" errors on\n",
       "             * Chrome.  But how to set the MIME type?  It doesn't seem\n",
       "             * to be part of the websocket stream */\n",
       "            evt.data.type = \"image/png\";\n",
       "\n",
       "            /* Free the memory for the previous frames */\n",
       "            if (fig.imageObj.src) {\n",
       "                (window.URL || window.webkitURL).revokeObjectURL(\n",
       "                    fig.imageObj.src);\n",
       "            }\n",
       "\n",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                evt.data);\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
       "            fig.imageObj.src = evt.data;\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        var msg = JSON.parse(evt.data);\n",
       "        var msg_type = msg['type'];\n",
       "\n",
       "        // Call the  \"handle_{type}\" callback, which takes\n",
       "        // the figure and JSON message as its only arguments.\n",
       "        try {\n",
       "            var callback = fig[\"handle_\" + msg_type];\n",
       "        } catch (e) {\n",
       "            console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        if (callback) {\n",
       "            try {\n",
       "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
       "                callback(fig, msg);\n",
       "            } catch (e) {\n",
       "                console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
       "            }\n",
       "        }\n",
       "    };\n",
       "}\n",
       "\n",
       "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
       "mpl.findpos = function(e) {\n",
       "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
       "    var targ;\n",
       "    if (!e)\n",
       "        e = window.event;\n",
       "    if (e.target)\n",
       "        targ = e.target;\n",
       "    else if (e.srcElement)\n",
       "        targ = e.srcElement;\n",
       "    if (targ.nodeType == 3) // defeat Safari bug\n",
       "        targ = targ.parentNode;\n",
       "\n",
       "    // jQuery normalizes the pageX and pageY\n",
       "    // pageX,Y are the mouse positions relative to the document\n",
       "    // offset() returns the position of the element relative to the document\n",
       "    var x = e.pageX - $(targ).offset().left;\n",
       "    var y = e.pageY - $(targ).offset().top;\n",
       "\n",
       "    return {\"x\": x, \"y\": y};\n",
       "};\n",
       "\n",
       "/*\n",
       " * return a copy of an object with only non-object keys\n",
       " * we need this to avoid circular references\n",
       " * http://stackoverflow.com/a/24161582/3208463\n",
       " */\n",
       "function simpleKeys (original) {\n",
       "  return Object.keys(original).reduce(function (obj, key) {\n",
       "    if (typeof original[key] !== 'object')\n",
       "        obj[key] = original[key]\n",
       "    return obj;\n",
       "  }, {});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.mouse_event = function(event, name) {\n",
       "    var canvas_pos = mpl.findpos(event)\n",
       "\n",
       "    if (name === 'button_press')\n",
       "    {\n",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    var x = canvas_pos.x * mpl.ratio;\n",
       "    var y = canvas_pos.y * mpl.ratio;\n",
       "\n",
       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
       "                             step: event.step,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "\n",
       "    /* This prevents the web browser from automatically changing to\n",
       "     * the text insertion cursor when the button is pressed.  We want\n",
       "     * to control all of the cursor setting manually through the\n",
       "     * 'cursor' event from matplotlib */\n",
       "    event.preventDefault();\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    // Handle any extra behaviour associated with a key event\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.key_event = function(event, name) {\n",
       "\n",
       "    // Prevent repeat events\n",
       "    if (name == 'key_press')\n",
       "    {\n",
       "        if (event.which === this._key)\n",
       "            return;\n",
       "        else\n",
       "            this._key = event.which;\n",
       "    }\n",
       "    if (name == 'key_release')\n",
       "        this._key = null;\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.which != 17)\n",
       "        value += \"ctrl+\";\n",
       "    if (event.altKey && event.which != 18)\n",
       "        value += \"alt+\";\n",
       "    if (event.shiftKey && event.which != 16)\n",
       "        value += \"shift+\";\n",
       "\n",
       "    value += 'k';\n",
       "    value += event.which.toString();\n",
       "\n",
       "    this._key_event_extra(event, name);\n",
       "\n",
       "    this.send_message(name, {key: value,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
       "    if (name == 'download') {\n",
       "        this.handle_save(this, null);\n",
       "    } else {\n",
       "        this.send_message(\"toolbar_button\", {name: name});\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
       "    this.message.textContent = tooltip;\n",
       "};\n",
       "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
       "\n",
       "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
       "\n",
       "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
       "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
       "    // object with the appropriate methods. Currently this is a non binary\n",
       "    // socket, so there is still some room for performance tuning.\n",
       "    var ws = {};\n",
       "\n",
       "    ws.close = function() {\n",
       "        comm.close()\n",
       "    };\n",
       "    ws.send = function(m) {\n",
       "        //console.log('sending', m);\n",
       "        comm.send(m);\n",
       "    };\n",
       "    // Register the callback with on_msg.\n",
       "    comm.on_msg(function(msg) {\n",
       "        //console.log('receiving', msg['content']['data'], msg);\n",
       "        // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
       "        ws.onmessage(msg['content']['data'])\n",
       "    });\n",
       "    return ws;\n",
       "}\n",
       "\n",
       "mpl.mpl_figure_comm = function(comm, msg) {\n",
       "    // This is the function which gets called when the mpl process\n",
       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
       "\n",
       "    var id = msg.content.data.id;\n",
       "    // Get hold of the div created by the display call when the Comm\n",
       "    // socket was opened in Python.\n",
       "    var element = $(\"#\" + id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm)\n",
       "\n",
       "    function ondownload(figure, format) {\n",
       "        window.open(figure.imageObj.src);\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy,\n",
       "                           ondownload,\n",
       "                           element.get(0));\n",
       "\n",
       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
       "    // web socket which is closed, not our websocket->open comm proxy.\n",
       "    ws_proxy.onopen();\n",
       "\n",
       "    fig.parent_element = element.get(0);\n",
       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
       "    if (!fig.cell_info) {\n",
       "        console.error(\"Failed to find cell for figure\", id, fig);\n",
       "        return;\n",
       "    }\n",
       "\n",
       "    var output_index = fig.cell_info[2]\n",
       "    var cell = fig.cell_info[0];\n",
       "\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
       "    var width = fig.canvas.width/mpl.ratio\n",
       "    fig.root.unbind('remove')\n",
       "\n",
       "    // Update the output cell to use the data from the current canvas.\n",
       "    fig.push_to_output();\n",
       "    var dataURL = fig.canvas.toDataURL();\n",
       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
       "    // the notebook keyboard shortcuts fail.\n",
       "    IPython.keyboard_manager.enable()\n",
       "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
       "    fig.close_ws(fig, msg);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.close_ws = function(fig, msg){\n",
       "    fig.send_message('closing', msg);\n",
       "    // fig.ws.close()\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
       "    // Turn the data on the canvas into data in the output cell.\n",
       "    var width = this.canvas.width/mpl.ratio\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Tell IPython that the notebook contents must change.\n",
       "    IPython.notebook.set_dirty(true);\n",
       "    this.send_message(\"ack\", {});\n",
       "    var fig = this;\n",
       "    // Wait a second, then push the new image to the DOM so\n",
       "    // that it is saved nicely (might be nice to debounce this).\n",
       "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items){\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) { continue; };\n",
       "\n",
       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
       "    buttongrp.append(button);\n",
       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
       "    titlebar.prepend(buttongrp);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(el){\n",
       "    var fig = this\n",
       "    el.on(\"remove\", function(){\n",
       "\tfig.close_ws(fig, {});\n",
       "    });\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
       "    // this is important to make the div 'focusable\n",
       "    el.attr('tabindex', 0)\n",
       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
       "    // off when our div gets focus\n",
       "\n",
       "    // location in version 3\n",
       "    if (IPython.notebook.keyboard_manager) {\n",
       "        IPython.notebook.keyboard_manager.register_events(el);\n",
       "    }\n",
       "    else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    var manager = IPython.notebook.keyboard_manager;\n",
       "    if (!manager)\n",
       "        manager = IPython.keyboard_manager;\n",
       "\n",
       "    // Check for shift+enter\n",
       "    if (event.shiftKey && event.which == 13) {\n",
       "        this.canvas_div.blur();\n",
       "        event.shiftKey = false;\n",
       "        // Send a \"J\" for go to next cell\n",
       "        event.which = 74;\n",
       "        event.keyCode = 74;\n",
       "        manager.command_mode();\n",
       "        manager.handle_keydown(event);\n",
       "    }\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    fig.ondownload(fig, null);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.find_output_cell = function(html_output) {\n",
       "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
       "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
       "    // IPython event is triggered only after the cells have been serialised, which for\n",
       "    // our purposes (turning an active figure into a static one), is too late.\n",
       "    var cells = IPython.notebook.get_cells();\n",
       "    var ncells = cells.length;\n",
       "    for (var i=0; i<ncells; i++) {\n",
       "        var cell = cells[i];\n",
       "        if (cell.cell_type === 'code'){\n",
       "            for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
       "                var data = cell.output_area.outputs[j];\n",
       "                if (data.data) {\n",
       "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
       "                    data = data.data;\n",
       "                }\n",
       "                if (data['text/html'] == html_output) {\n",
       "                    return [cell, data, j];\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "// Register the function which deals with the matplotlib target/channel.\n",
       "// The kernel may be null if the page has been refreshed.\n",
       "if (IPython.notebook.kernel != null) {\n",
       "    IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
       "}\n"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img src=\"\" width=\"629\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib nbagg\n",
    "\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.animation as animation\n",
    "\n",
    "fig = plt.figure()\n",
    "x = np.arange(0, 10, 0.1)\n",
    "\n",
    "ims = []\n",
    "for a in range(50):\n",
    "    y = np.sin(x - a)\n",
    "    im = plt.plot(x, y, \"r\")\n",
    "    ims.append(im)\n",
    "\n",
    "ani = animation.ArtistAnimation(fig, ims)\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
